package br.com.pontoe.model.persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

import br.com.pontoe.model.conexao.Conexao;
import br.com.pontoe.model.entidades.Cidade;

/**
 * DAO para a entidade Cidade
 * 
 * @author Cleison
 * @version 1.0
 * @since 07/05/2010
 */
public class CidadeDAO implements DAOInterface<Cidade> {

	private StringBuilder sql = new StringBuilder();
	private Connection con = null;
	private PreparedStatement stm = null;
	
	
	@Override
	public int adicionar(Cidade entidade) throws SQLException {
		int ret = -1;
		
		try {
			sql = new StringBuilder();
			sql.append("INSERT INTO CIDADE (IDCIDADE, NOME, IDESTADO) ");
			sql.append("VALUES (NULL, \'?\', ?)");
			
			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());
			
			stm.setString(1, entidade.getNome());
			stm.setInt(2, entidade.getEstado().getId());
			
			ret = stm.executeUpdate();
		}
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	@Override
	public boolean atualizar(Cidade entidade) throws SQLException {
		boolean ret = true;
		
		try {
			sql = new StringBuilder();
			sql.append("UPDADE CIDADE ");
			sql.append("SET   NOME = \'?\', IDESTADO = ? ");
			sql.append("WHERE IDCIDADE = ? ");
			
			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());
			
			stm.setString(1, entidade.getNome());
			stm.setInt(2, entidade.getEstado().getId());
			stm.setInt(3, entidade.getId());
			
			ret = stm.execute();
		}
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	@Override
	public Cidade localizar(int id) throws SQLException {
		Cidade ret = null;
		
		try {
			sql = new StringBuilder();
			sql.append("SELECT 	IDCIDADE, NOME, IDESTADO ");
			sql.append("FROM 	CIDADE ");
			sql.append("WHERE 	IDCIDADE = ? ");
			
			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());
			stm.setInt(1, id);
			
			ResultSet temp = stm.executeQuery();
			EstadoDAO eTmp = new EstadoDAO();
			
			if(temp.next()) {
				ret = new Cidade();
				ret.setId(temp.getInt("IDCIDADE"));
				ret.setNome(temp.getString("NOME"));
				ret.setEstado(eTmp.localizar(temp.getInt("IDESTADO")));
			}
			temp.close();
		}
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	@Override
	public List<Cidade> localizarTodos() throws SQLException {
		List<Cidade> ret = new ArrayList<Cidade>();
		
		try {
			sql = new StringBuilder();
			sql.append("SELECT 	IDCIDADE, NOME, IDESTADO ");
			sql.append("FROM 	CIDADE ");
			
			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());
			
			ResultSet temp = stm.executeQuery();
			EstadoDAO eTmp = new EstadoDAO();
			
			while(temp.next()) {
				Cidade c = new Cidade();
				c.setId(temp.getInt("IDCIDADE"));
				c.setNome(temp.getString("NOME"));
				c.setEstado(eTmp.localizar(temp.getInt("IDESTADO")));
				
				ret.add(c);
			}
			temp.close();
		}
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}

	@Override
	public boolean remover(Cidade entidade) throws SQLException {
		boolean ret = true;
		
		try {
			sql = new StringBuilder();
			sql.append("DELETE FROM CIDADE");
			sql.append("WHERE IDCIDADE = ? ");
			
			con = Conexao.getInstance().getConnection();
			stm = (PreparedStatement) con.prepareStatement(sql.toString());
			
			stm.setInt(1, entidade.getId());
			
			ret = stm.execute();
		}
		finally {
			stm.close();
			con.close();
		}
		return ret;
	}
}